package com.horizon.common.repository;

import com.horizon.common.entity.IBaseEntity;

import javax.persistence.Query;
import java.util.List;

/**
 * 基本数据化操作接口
 *
 * @author wangfuwei
 * @version 2018-08-07
 */
public interface IBaseRepository {

    /**
     * 持久化实体类
     *
     * @param entity 实体类
     */
    <T extends IBaseEntity> void persist(T entity);

    /**
     * 删除实体类
     *
     * @param entity 实体类
     */
    <T extends IBaseEntity> void remove(T entity);

    /**
     * 保存或更新实体类
     *
     * @param entity 实体类
     */
    <T extends IBaseEntity> T merge(T entity);

    /**
     * 根据主键查询实体类
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     */
    <T extends IBaseEntity> T find(Class<T> entityClass, String fdId);

    /**
     * 根据主键查询实体类(懒加载)
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     */
    <T extends IBaseEntity> T getReference(Class<T> entityClass, String fdId);

    /**
     * 根据主键判断存在持久化实体类
     *
     * @param entityClass 实体类 Class
     * @param fdId        主键
     */
    <T extends IBaseEntity> Boolean isExist(Class<T> entityClass, String fdId);

    /**
     * 根据HQL语句查询列表数据
     *
     * @param hqlInfo HQL语句
     */
    <T> List<T> findList(HQLInfo hqlInfo);

    /**
     * 根据HQL语句查询分页数据
     *
     * @param hqlInfo HQL语句
     */
    Page findPage(HQLInfo hqlInfo);

    /**
     * 获取HQL Query对象
     *
     * @param hql HQL语句
     */
    Query HQLQuery(String hql);

    /**
     * 获取SQL Query对象
     *
     * @param sql SQL语句
     */
    Query SQLQuery(String sql);

    /**
     * 刷新实体对象
     *
     * @param entity 实体对象
     */
    <T extends IBaseEntity> void refresh(T entity);

    /**
     * 刷新缓存
     */
    void flush();
}
